Micron Document
🎖️GitЯра🎖️


Displaying Raw • Download

feature/node/src/commonMain/kotlin/org/meshtastic/feature/node/metrics/SignalMetrics.kt 2d20cd8a4708e2ef66e98d5259f3a97ec93f240a (2d20cd8a) Text, 27.42 KB

T8b949e/*
* Copyright (c) 2026 Meshtastic LLC
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
Tff7b72package T7ee787org.meshtastic.feature.node.metrics

Tff7b72import T7ee787androidx.compose.foundation.layout.Arrangement
Tff7b72import T7ee787androidx.compose.foundation.layout.Box
Tff7b72import T7ee787androidx.compose.foundation.layout.Column
Tff7b72import T7ee787androidx.compose.foundation.layout.ExperimentalLayoutApi
Tff7b72import T7ee787androidx.compose.foundation.layout.FlowRow
Tff7b72import T7ee787androidx.compose.foundation.layout.IntrinsicSize
Tff7b72import T7ee787androidx.compose.foundation.layout.Row
Tff7b72import T7ee787androidx.compose.foundation.layout.Spacer
Tff7b72import T7ee787androidx.compose.foundation.layout.fillMaxSize
Tff7b72import T7ee787androidx.compose.foundation.layout.fillMaxWidth
Tff7b72import T7ee787androidx.compose.foundation.layout.height
Tff7b72import T7ee787androidx.compose.foundation.layout.padding
Tff7b72import T7ee787androidx.compose.foundation.layout.width
Tff7b72import T7ee787androidx.compose.foundation.lazy.LazyColumn
Tff7b72import T7ee787androidx.compose.foundation.lazy.itemsIndexed
Tff7b72import T7ee787androidx.compose.material3.ButtonDefaults
Tff7b72import T7ee787androidx.compose.material3.Icon
Tff7b72import T7ee787androidx.compose.material3.MaterialTheme
Tff7b72import T7ee787androidx.compose.material3.OutlinedButton
Tff7b72import T7ee787androidx.compose.material3.Text
Tff7b72import T7ee787androidx.compose.runtime.Composable
Tff7b72import T7ee787androidx.compose.runtime.LaunchedEffect
Tff7b72import T7ee787androidx.compose.runtime.getValue
Tff7b72import T7ee787androidx.compose.runtime.remember
Tff7b72import T7ee787androidx.compose.ui.Alignment
Tff7b72import T7ee787androidx.compose.ui.Modifier
Tff7b72import T7ee787androidx.compose.ui.graphics.Color
Tff7b72import T7ee787androidx.compose.ui.text.font.FontWeight
Tff7b72import T7ee787androidx.compose.ui.unit.dp
Tff7b72import T7ee787androidx.lifecycle.compose.collectAsStateWithLifecycle
Tff7b72import T7ee787com.patrykandpatrick.vico.compose.cartesian.VicoScrollState
Tff7b72import T7ee787com.patrykandpatrick.vico.compose.cartesian.axis.Axis
Tff7b72import T7ee787com.patrykandpatrick.vico.compose.cartesian.axis.VerticalAxis
Tff7b72import T7ee787com.patrykandpatrick.vico.compose.cartesian.data.CartesianLayerRangeProvider
Tff7b72import T7ee787com.patrykandpatrick.vico.compose.cartesian.data.lineModel
Tff7b72import T7ee787com.patrykandpatrick.vico.compose.cartesian.layer.LineCartesianLayer
Tff7b72import T7ee787org.jetbrains.compose.resources.stringResource
Tff7b72import T7ee787org.meshtastic.core.common.util.DateFormatter
Tff7b72import T7ee787org.meshtastic.core.common.util.MetricFormatter
Tff7b72import T7ee787org.meshtastic.core.model.TelemetryType
Tff7b72import T7ee787org.meshtastic.core.model.util.TimeConstants.MS_PER_SEC
Tff7b72import T7ee787org.meshtastic.core.model.util.formatUptime
Tff7b72import T7ee787org.meshtastic.core.model.util.rxTimeOrNull
Tff7b72import T7ee787org.meshtastic.core.model.util.snrOrNull
Tff7b72import T7ee787org.meshtastic.core.resources.Res
Tff7b72import T7ee787org.meshtastic.core.resources.busy_noise_floor
Tff7b72import T7ee787org.meshtastic.core.resources.clear
Tff7b72import T7ee787org.meshtastic.core.resources.local_stats_bad
Tff7b72import T7ee787org.meshtastic.core.resources.local_stats_nodes
Tff7b72import T7ee787org.meshtastic.core.resources.local_stats_noise
Tff7b72import T7ee787org.meshtastic.core.resources.local_stats_relays
Tff7b72import T7ee787org.meshtastic.core.resources.local_stats_traffic
Tff7b72import T7ee787org.meshtastic.core.resources.local_stats_uptime
Tff7b72import T7ee787org.meshtastic.core.resources.no_local_stats
Tff7b72import T7ee787org.meshtastic.core.resources.noise_floor
Tff7b72import T7ee787org.meshtastic.core.resources.noise_floor_definition
Tff7b72import T7ee787org.meshtastic.core.resources.noise_floor_no_reading
Tff7b72import T7ee787org.meshtastic.core.resources.request
Tff7b72import T7ee787org.meshtastic.core.resources.rssi
Tff7b72import T7ee787org.meshtastic.core.resources.rssi_definition
Tff7b72import T7ee787org.meshtastic.core.resources.save
Tff7b72import T7ee787org.meshtastic.core.resources.signal_quality
Tff7b72import T7ee787org.meshtastic.core.resources.snr
Tff7b72import T7ee787org.meshtastic.core.resources.snr_definition
Tff7b72import T7ee787org.meshtastic.core.ui.component.LoraSignalIndicator
Tff7b72import T7ee787org.meshtastic.core.ui.icon.Delete
Tff7b72import T7ee787org.meshtastic.core.ui.icon.MeshtasticIcons
Tff7b72import T7ee787org.meshtastic.core.ui.icon.Refresh
Tff7b72import T7ee787org.meshtastic.core.ui.icon.Save
Tff7b72import T7ee787org.meshtastic.core.ui.theme.GraphColors.Blue
Tff7b72import T7ee787org.meshtastic.core.ui.theme.GraphColors.Gold
Tff7b72import T7ee787org.meshtastic.core.ui.theme.GraphColors.Green
Tff7b72import T7ee787org.meshtastic.core.ui.theme.GraphColors.Orange
Tff7b72import T7ee787org.meshtastic.core.ui.theme.GraphColors.Red
Tff7b72import T7ee787org.meshtastic.core.ui.util.rememberSaveFileLauncher
Tff7b72import T7ee787org.meshtastic.proto.MeshPacket
Tff7b72import T7ee787org.meshtastic.proto.Telemetry

Tff7b72private Tff7b72const Tff7b72val Te6edf3QUIET_NOISE_FLOOR_DBM Tff7b72= Tff7b72-T79c0ff9T79c0ff5
Tff7b72private Tff7b72const Tff7b72val Te6edf3BUSY_FLOOR_DBM Tff7b72= Tff7b72-T79c0ff8T79c0ff5
Tff7b72private Tff7b72const Tff7b72val Te6edf3MIN_DBM_AXIS Tff7b72= Tff7b72-T79c0ff1T79c0ff2T79c0ff0.0
Tff7b72private Tff7b72const Tff7b72val Te6edf3MAX_DBM_AXIS Tff7b72= T79c0ff0.0

Tff7b72private Tff7b72enum Tff7b72class T56d364SignalMetricTb4b4b4(Tff7b72val Te6edf3colorTb4b4b4: Te6edf3ColorTb4b4b4) Tb4b4b4{
Te6edf3NOISE_FLOORTb4b4b4(Te6edf3GoldTb4b4b4)Tb4b4b4,
Te6edf3BUSY_FLOORTb4b4b4(Te6edf3RedTb4b4b4)Tb4b4b4,
Te6edf3SNRTb4b4b4(Te6edf3GreenTb4b4b4)Tb4b4b4,
Te6edf3RSSITb4b4b4(Te6edf3BlueTb4b4b4)Tb4b4b4,
Tb4b4b4}

Tff7b72private Tff7b72val Te6edf3LEGEND_DATA Tff7b72=
Te6edf3listOfTb4b4b4(
Te6edf3LegendDataTb4b4b4(Te6edf3nameRes Tff7b72= Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3noise_floorTb4b4b4, Te6edf3color Tff7b72= Te6edf3SignalMetricTb4b4b4.Te6edf3NOISE_FLOORTb4b4b4.Te6edf3colorTb4b4b4, Te6edf3isLine Tff7b72= Tff7b72trueTb4b4b4)Tb4b4b4,
Te6edf3LegendDataTb4b4b4(Te6edf3nameRes Tff7b72= Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3rssiTb4b4b4, Te6edf3color Tff7b72= Te6edf3SignalMetricTb4b4b4.Te6edf3RSSITb4b4b4.Te6edf3colorTb4b4b4)Tb4b4b4,
Te6edf3LegendDataTb4b4b4(Te6edf3nameRes Tff7b72= Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3snrTb4b4b4, Te6edf3color Tff7b72= Te6edf3SignalMetricTb4b4b4.Te6edf3SNRTb4b4b4.Te6edf3colorTb4b4b4)Tb4b4b4,
Tb4b4b4)

T8b949e/** Builds the combined signal log, newest first. Kept out of the composable so the LazyColumn keys are testable. */
Tff7b72internal Tff7b72fun Td2a8ffbuildSignalLogTb4b4b4(Te6edf3signalDataTb4b4b4: Te6edf3ListTff7b72<Te6edf3MeshPacketTff7b72>Tb4b4b4, Te6edf3localStatsDataTb4b4b4: Te6edf3ListTff7b72<Te6edf3TelemetryTff7b72>Tb4b4b4)Tb4b4b4: Te6edf3ListTff7b72<Te6edf3SignalLogEntryTff7b72> Tb4b4b4{
Tff7b72val Te6edf3localStats Tff7b72= Te6edf3localStatsDataTb4b4b4.Te6edf3mapIndexed Tb4b4b4{ Te6edf3indexTb4b4b4, Te6edf3telemetry Tff7b72-Tff7b72> Te6edf3SignalLogEntryTb4b4b4.Te6edf3LocalStatsEntryTb4b4b4(Te6edf3telemetryTb4b4b4, Te6edf3indexTb4b4b4) Tb4b4b4}
Tff7b72val Te6edf3packets Tff7b72= Te6edf3signalDataTb4b4b4.Te6edf3mapIndexed Tb4b4b4{ Te6edf3indexTb4b4b4, Te6edf3packet Tff7b72-Tff7b72> Te6edf3SignalLogEntryTb4b4b4.Te6edf3PacketEntryTb4b4b4(Te6edf3packetTb4b4b4, Te6edf3indexTb4b4b4) Tb4b4b4}
Tff7b72return Tb4b4b4(Te6edf3localStats Tff7b72+ Te6edf3packetsTb4b4b4)Tb4b4b4.Te6edf3sortedByDescending Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3timeSeconds Tb4b4b4}
Tb4b4b4}

Tff7b72internal Tff7b72sealed Tff7b72interface T56d364SignalLogEntry Tb4b4b4{
Tff7b72val Te6edf3timeSecondsTb4b4b4: Tffa657Int

T8b949e/** Stable, collision-free identity for use as a LazyColumn item key across both entry types. */
Tff7b72val Te6edf3keyTb4b4b4: Tffa657Any

T8b949e/** Distinguishes the two card layouts so Compose can reuse compositions per type. */
Tff7b72val Te6edf3contentTypeTb4b4b4: Tffa657Any

Tff7b72data Tff7b72class T56d364LocalStatsEntryTb4b4b4(Tff7b72val Te6edf3telemetryTb4b4b4: Te6edf3TelemetryTb4b4b4, Tff7b72val Te6edf3indexTb4b4b4: Tffa657IntTb4b4b4) Tb4b4b4: Te6edf3SignalLogEntry Tb4b4b4{
Tff7b72override Tff7b72val Te6edf3timeSecondsTb4b4b4: Tffa657Int Tff7b72= Te6edf3telemetryTb4b4b4.Te6edf3time

T8b949e// Local stats telemetry is an id-less proto; the source-list index disambiguates same-second samples.
Tff7b72override Tff7b72val Te6edf3keyTb4b4b4: Tffa657Any Tff7b72= Ta5d6ff"Ta5d6fflocal_stats_Tffd700${Te6edf3telemetryTb4b4b4.Te6edf3timeTffd700}Ta5d6ff_Tffd700$Te6edf3indexTa5d6ff"
Tff7b72override Tff7b72val Te6edf3contentTypeTb4b4b4: Tffa657Any Tff7b72= Ta5d6ff"Ta5d6fflocal_statsTa5d6ff"
Tb4b4b4}

Tff7b72data Tff7b72class T56d364PacketEntryTb4b4b4(Tff7b72val Te6edf3meshPacketTb4b4b4: Te6edf3MeshPacketTb4b4b4, Tff7b72val Te6edf3indexTb4b4b4: Tffa657IntTb4b4b4) Tb4b4b4: Te6edf3SignalLogEntry Tb4b4b4{
Tff7b72override Tff7b72val Te6edf3timeSecondsTb4b4b4: Tffa657Int Tff7b72= Te6edf3meshPacketTb4b4b4.Te6edf3rxTimeOrNullTb4b4b4(Tb4b4b4) Tff7b72?: T79c0ff0

T8b949e// MeshPacket.id repeats: it is unique only per originating node, and retransmissions are stored per reception.
T8b949e// The source-list index disambiguates, as it does for local stats.
Tff7b72override Tff7b72val Te6edf3keyTb4b4b4: Tffa657Any Tff7b72= Ta5d6ff"Ta5d6ffpacket_Tffd700${Te6edf3meshPacketTb4b4b4.Te6edf3idTffd700}Ta5d6ff_Tffd700$Te6edf3indexTa5d6ff"
Tff7b72override Tff7b72val Te6edf3contentTypeTb4b4b4: Tffa657Any Tff7b72= Ta5d6ff"Ta5d6ffsignal_packetTa5d6ff"
Tb4b4b4}
Tb4b4b4}

Tf0883e@SuppressTb4b4b4(Ta5d6ff"Ta5d6ffLongMethodTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffCyclomaticComplexMethodTa5d6ff"Tb4b4b4)
Tf0883e@Composable
Tff7b72fun Td2a8ffSignalMetricsScreenTb4b4b4(Te6edf3viewModelTb4b4b4: Te6edf3MetricsViewModelTb4b4b4, Te6edf3onNavigateUpTb4b4b4: Tb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4, Te6edf3modifierTb4b4b4: Te6edf3Modifier Tff7b72= Te6edf3ModifierTb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3state Tff7b72by Te6edf3viewModelTb4b4b4.Te6edf3stateTb4b4b4.Te6edf3collectAsStateWithLifecycleTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3timeFrame Tff7b72by Te6edf3viewModelTb4b4b4.Te6edf3timeFrameTb4b4b4.Te6edf3collectAsStateWithLifecycleTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3availableTimeFrames Tff7b72by Te6edf3viewModelTb4b4b4.Te6edf3availableTimeFramesTb4b4b4.Te6edf3collectAsStateWithLifecycleTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3threshold Tff7b72= Te6edf3timeFrameTb4b4b4.Te6edf3timeThresholdTb4b4b4(Tb4b4b4)
T8b949e// An unstamped packet has no place on a time axis. Dropping it here is the invariant every downstream
T8b949e// `rxTimeOrNull() ?: 0` in this file relies on, so none of them can render or plot 1970.
Tff7b72val Te6edf3signalData Tff7b72=
Te6edf3stateTb4b4b4.Te6edf3signalMetricsTb4b4b4.Te6edf3filter Tb4b4b4{ Te6edf3packet Tff7b72-Tff7b72>
Tff7b72val Te6edf3rxTime Tff7b72= Te6edf3packetTb4b4b4.Te6edf3rxTimeOrNullTb4b4b4(Tb4b4b4) Tff7b72?: Tff7b72returnTf0883e@filter Tff7b72false
Te6edf3rxTimeTb4b4b4.Te6edf3toLongTb4b4b4(Tb4b4b4) Tff7b72>Tff7b72= Te6edf3threshold
Tb4b4b4}
Tff7b72val Te6edf3localStatsData Tff7b72= Te6edf3stateTb4b4b4.Te6edf3localStatsTb4b4b4.Te6edf3filter Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3timeTb4b4b4.Te6edf3toLongTb4b4b4(Tb4b4b4) Tff7b72>Tff7b72= Te6edf3threshold Tff7b72&Tff7b72& Tffa657itTb4b4b4.Te6edf3local_stats Tff7b72!Tff7b72= Tff7b72null Tb4b4b4}
Tff7b72val Te6edf3data Tff7b72= Te6edf3rememberTb4b4b4(Te6edf3signalDataTb4b4b4, Te6edf3localStatsDataTb4b4b4) Tb4b4b4{ Te6edf3buildSignalLogTb4b4b4(Te6edf3signalDataTb4b4b4, Te6edf3localStatsDataTb4b4b4) Tb4b4b4}
Tff7b72val Te6edf3hasNoiseFloor Tff7b72= Te6edf3rememberTb4b4b4(Te6edf3localStatsDataTb4b4b4) Tb4b4b4{ Te6edf3localStatsDataTb4b4b4.Te6edf3any Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3local_statsTff7b72?.Te6edf3noise_floor Tff7b72!Tff7b72= T79c0ff0 Tb4b4b4} Tb4b4b4}
Tff7b72val Te6edf3hasRssi Tff7b72= Te6edf3rememberTb4b4b4(Te6edf3signalDataTb4b4b4) Tb4b4b4{ Te6edf3signalDataTb4b4b4.Te6edf3any Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3rx_rssi Tff7b72!Tff7b72= Tff7b72null Tb4b4b4} Tb4b4b4}
Tff7b72val Te6edf3hasSnr Tff7b72= Te6edf3rememberTb4b4b4(Te6edf3signalDataTb4b4b4) Tb4b4b4{ Te6edf3signalDataTb4b4b4.Te6edf3any Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3snrOrNullTb4b4b4(Tb4b4b4) Tff7b72!Tff7b72= Tff7b72null Tb4b4b4} Tb4b4b4}
Tff7b72val Te6edf3hasAnyLocalStats Tff7b72= Te6edf3stateTb4b4b4.Te6edf3localStatsTb4b4b4.Te6edf3isNotEmptyTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3localStatsExportLauncher Tff7b72= Te6edf3rememberSaveFileLauncher Tb4b4b4{ Te6edf3uri Tff7b72-Tff7b72> Te6edf3viewModelTb4b4b4.Te6edf3saveLocalStatsCSVTb4b4b4(Te6edf3uriTb4b4b4, Te6edf3localStatsDataTb4b4b4) Tb4b4b4}
Tff7b72val Te6edf3signalExportLauncher Tff7b72= Te6edf3rememberSaveFileLauncher Tb4b4b4{ Te6edf3uri Tff7b72-Tff7b72> Te6edf3viewModelTb4b4b4.Te6edf3saveSignalMetricsCSVTb4b4b4(Te6edf3uriTb4b4b4, Te6edf3signalDataTb4b4b4) Tb4b4b4}

Te6edf3BaseMetricScreenTb4b4b4(
Te6edf3onNavigateUp Tff7b72= Te6edf3onNavigateUpTb4b4b4,
Te6edf3telemetryType Tff7b72= Tff7b72nullTb4b4b4,
Te6edf3titleRes Tff7b72= Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3signal_qualityTb4b4b4,
Te6edf3nodeName Tff7b72= Te6edf3stateTb4b4b4.Te6edf3nodeTff7b72?.Te6edf3userTff7b72?.Te6edf3long_name Tff7b72?: Ta5d6ff"Ta5d6ff"Tb4b4b4,
Te6edf3data Tff7b72= Te6edf3dataTb4b4b4,
Te6edf3timeProvider Tff7b72= Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3timeSecondsTb4b4b4.Te6edf3toDoubleTb4b4b4(Tb4b4b4) Tb4b4b4}Tb4b4b4,
Te6edf3modifier Tff7b72= Te6edf3modifierTb4b4b4,
Te6edf3onExportCsv Tff7b72=
Tff7b72if Tb4b4b4(Te6edf3signalDataTb4b4b4.Te6edf3isNotEmptyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Tb4b4b4{ Te6edf3signalExportLauncherTb4b4b4(Ta5d6ff"Ta5d6ffsignal_metrics.csvTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6fftext/csvTa5d6ff"Tb4b4b4) Tb4b4b4}
Tb4b4b4} Tff7b72else Tb4b4b4{
Tff7b72null
Tb4b4b4}Tb4b4b4,
Te6edf3infoData Tff7b72=
Te6edf3buildList Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3hasNoiseFloorTb4b4b4) Tb4b4b4{
Te6edf3addTb4b4b4(
Te6edf3InfoDialogDataTb4b4b4(
Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3noise_floorTb4b4b4,
Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3noise_floor_definitionTb4b4b4,
Te6edf3SignalMetricTb4b4b4.Te6edf3NOISE_FLOORTb4b4b4.Te6edf3colorTb4b4b4,
Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3hasSnrTb4b4b4) Te6edf3addTb4b4b4(Te6edf3InfoDialogDataTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3snrTb4b4b4, Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3snr_definitionTb4b4b4, Te6edf3SignalMetricTb4b4b4.Te6edf3SNRTb4b4b4.Te6edf3colorTb4b4b4)Tb4b4b4)
Tff7b72if Tb4b4b4(Te6edf3hasRssiTb4b4b4) Te6edf3addTb4b4b4(Te6edf3InfoDialogDataTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3rssiTb4b4b4, Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3rssi_definitionTb4b4b4, Te6edf3SignalMetricTb4b4b4.Te6edf3RSSITb4b4b4.Te6edf3colorTb4b4b4)Tb4b4b4)
Tb4b4b4}Tb4b4b4,
Te6edf3controlPart Tff7b72= Tb4b4b4{
Te6edf3TimeFrameSelectorTb4b4b4(
Te6edf3selectedTimeFrame Tff7b72= Te6edf3timeFrameTb4b4b4,
Te6edf3availableTimeFrames Tff7b72= Te6edf3availableTimeFramesTb4b4b4,
Te6edf3onTimeFrameSelected Tff7b72= Te6edf3viewModelTff7b72::Te6edf3setTimeFrameTb4b4b4,
Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3paddingTb4b4b4(Te6edf3horizontal Tff7b72= T79c0ff1T79c0ff6.Te6edf3dpTb4b4b4)Tb4b4b4,
Tb4b4b4)
Tb4b4b4}Tb4b4b4,
Te6edf3chartPart Tff7b72= Tb4b4b4{ Te6edf3contentModifierTb4b4b4, Te6edf3selectedXTb4b4b4, Te6edf3vicoScrollStateTb4b4b4, Te6edf3onPointSelected Tff7b72-Tff7b72>
Te6edf3SignalMetricsChartTb4b4b4(
Te6edf3modifier Tff7b72= Te6edf3contentModifierTb4b4b4,
Te6edf3localStats Tff7b72= Te6edf3localStatsDataTb4b4b4.Te6edf3reversedTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3meshPackets Tff7b72= Te6edf3signalDataTb4b4b4.Te6edf3reversedTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3vicoScrollState Tff7b72= Te6edf3vicoScrollStateTb4b4b4,
Te6edf3selectedX Tff7b72= Te6edf3selectedXTb4b4b4,
Te6edf3onPointSelected Tff7b72= Te6edf3onPointSelectedTb4b4b4,
Tb4b4b4)
Tb4b4b4}Tb4b4b4,
Te6edf3listPart Tff7b72= Tb4b4b4{ Te6edf3contentModifierTb4b4b4, Te6edf3selectedXTb4b4b4, Te6edf3lazyListStateTb4b4b4, Te6edf3onCardClick Tff7b72-Tff7b72>
Tff7b72if Tb4b4b4(Te6edf3dataTb4b4b4.Te6edf3isEmptyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3BoxTb4b4b4(Te6edf3modifier Tff7b72= Te6edf3contentModifierTb4b4b4.Te6edf3fillMaxSizeTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3contentAlignment Tff7b72= Te6edf3AlignmentTb4b4b4.Te6edf3CenterTb4b4b4) Tb4b4b4{
Te6edf3TextTb4b4b4(
Te6edf3text Tff7b72= Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3no_local_statsTb4b4b4)Tb4b4b4,
Te6edf3style Tff7b72= Te6edf3MaterialThemeTb4b4b4.Te6edf3typographyTb4b4b4.Te6edf3bodyLargeTb4b4b4,
Te6edf3color Tff7b72= Te6edf3MaterialThemeTb4b4b4.Te6edf3colorSchemeTb4b4b4.Te6edf3onSurfaceVariantTb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3LazyColumnTb4b4b4(Te6edf3modifier Tff7b72= Te6edf3contentModifierTb4b4b4.Te6edf3fillMaxSizeTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3state Tff7b72= Te6edf3lazyListStateTb4b4b4) Tb4b4b4{
Te6edf3itemsIndexedTb4b4b4(
Te6edf3dataTb4b4b4,
Te6edf3key Tff7b72= Tb4b4b4{ Te6edf3_Tb4b4b4, Te6edf3entry Tff7b72-Tff7b72> Te6edf3entryTb4b4b4.Te6edf3key Tb4b4b4}Tb4b4b4,
Te6edf3contentType Tff7b72= Tb4b4b4{ Te6edf3_Tb4b4b4, Te6edf3entry Tff7b72-Tff7b72> Te6edf3entryTb4b4b4.Te6edf3contentType Tb4b4b4}Tb4b4b4,
Tb4b4b4) Tb4b4b4{ Te6edf3_Tb4b4b4, Te6edf3entry Tff7b72-Tff7b72>
Tff7b72when Tb4b4b4(Te6edf3entryTb4b4b4) Tb4b4b4{
Tff7b72is Te6edf3SignalLogEntryTb4b4b4.Te6edf3LocalStatsEntry Tff7b72-Tff7b72>
Te6edf3LocalStatsCardTb4b4b4(
Te6edf3telemetry Tff7b72= Te6edf3entryTb4b4b4.Te6edf3telemetryTb4b4b4,
Te6edf3isSelected Tff7b72= Te6edf3entryTb4b4b4.Te6edf3timeSecondsTb4b4b4.Te6edf3toDoubleTb4b4b4(Tb4b4b4) Tff7b72=Tff7b72= Te6edf3selectedXTb4b4b4,
Te6edf3onClick Tff7b72= Tb4b4b4{ Te6edf3onCardClickTb4b4b4(Te6edf3entryTb4b4b4.Te6edf3timeSecondsTb4b4b4.Te6edf3toDoubleTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4}Tb4b4b4,
Tb4b4b4)

Tff7b72is Te6edf3SignalLogEntryTb4b4b4.Te6edf3PacketEntry Tff7b72-Tff7b72>
Te6edf3SignalMetricsCardTb4b4b4(
Te6edf3meshPacket Tff7b72= Te6edf3entryTb4b4b4.Te6edf3meshPacketTb4b4b4,
Te6edf3isSelected Tff7b72= Te6edf3entryTb4b4b4.Te6edf3timeSecondsTb4b4b4.Te6edf3toDoubleTb4b4b4(Tb4b4b4) Tff7b72=Tff7b72= Te6edf3selectedXTb4b4b4,
Te6edf3onClick Tff7b72= Tb4b4b4{ Te6edf3onCardClickTb4b4b4(Te6edf3entryTb4b4b4.Te6edf3timeSecondsTb4b4b4.Te6edf3toDoubleTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4}Tb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}Tb4b4b4,
Te6edf3bottomContent Tff7b72= Tb4b4b4{
Te6edf3LocalStatsActionButtonsTb4b4b4(
Te6edf3hasLocalStats Tff7b72= Te6edf3hasAnyLocalStatsTb4b4b4,
Te6edf3hasVisibleLocalStats Tff7b72= Te6edf3localStatsDataTb4b4b4.Te6edf3isNotEmptyTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3onClear Tff7b72= Te6edf3viewModelTff7b72::Te6edf3clearLocalStatsTb4b4b4,
Te6edf3onRequest Tff7b72= Tb4b4b4{ Te6edf3viewModelTb4b4b4.Te6edf3requestTelemetryTb4b4b4(Te6edf3TelemetryTypeTb4b4b4.Te6edf3LOCAL_STATSTb4b4b4) Tb4b4b4}Tb4b4b4,
Te6edf3onSave Tff7b72= Tb4b4b4{ Te6edf3localStatsExportLauncherTb4b4b4(Ta5d6ff"Ta5d6fflocal_stats.csvTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6fftext/csvTa5d6ff"Tb4b4b4) Tb4b4b4}Tb4b4b4,
Tb4b4b4)
Tb4b4b4}Tb4b4b4,
Tb4b4b4)
Tb4b4b4}

Tf0883e@OptInTb4b4b4(Te6edf3ExperimentalLayoutApiTff7b72::Te6edf3classTb4b4b4)
Tf0883e@Composable
Tff7b72private Tff7b72fun Td2a8ffLocalStatsActionButtonsTb4b4b4(
Te6edf3hasLocalStatsTb4b4b4: Tffa657BooleanTb4b4b4,
Te6edf3hasVisibleLocalStatsTb4b4b4: Tffa657BooleanTb4b4b4,
Te6edf3onClearTb4b4b4: Tb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4,
Te6edf3onRequestTb4b4b4: Tb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4,
Te6edf3onSaveTb4b4b4: Tb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4,
Te6edf3modifierTb4b4b4: Te6edf3Modifier Tff7b72= Te6edf3ModifierTb4b4b4,
Tb4b4b4) Tb4b4b4{
Te6edf3FlowRowTb4b4b4(
Te6edf3modifier Tff7b72= Te6edf3modifierTb4b4b4.Te6edf3fillMaxWidthTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3paddingTb4b4b4(Te6edf3horizontal Tff7b72= T79c0ff2T79c0ff4.Te6edf3dpTb4b4b4, Te6edf3vertical Tff7b72= T79c0ff1T79c0ff6.Te6edf3dpTb4b4b4)Tb4b4b4,
Te6edf3horizontalArrangement Tff7b72= Te6edf3ArrangementTb4b4b4.Te6edf3spacedByTb4b4b4(T79c0ff8.Te6edf3dpTb4b4b4)Tb4b4b4,
Te6edf3verticalArrangement Tff7b72= Te6edf3ArrangementTb4b4b4.Te6edf3spacedByTb4b4b4(T79c0ff8.Te6edf3dpTb4b4b4)Tb4b4b4,
Tb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3hasLocalStatsTb4b4b4) Tb4b4b4{
Te6edf3OutlinedButtonTb4b4b4(
Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3weightTb4b4b4(T79c0ff1fTb4b4b4)Tb4b4b4,
Te6edf3onClick Tff7b72= Te6edf3onClearTb4b4b4,
Te6edf3colors Tff7b72= Te6edf3ButtonDefaultsTb4b4b4.Te6edf3outlinedButtonColorsTb4b4b4(Te6edf3contentColor Tff7b72= Te6edf3MaterialThemeTb4b4b4.Te6edf3colorSchemeTb4b4b4.Te6edf3errorTb4b4b4)Tb4b4b4,
Tb4b4b4) Tb4b4b4{
Te6edf3IconTb4b4b4(Te6edf3imageVector Tff7b72= Te6edf3MeshtasticIconsTb4b4b4.Te6edf3DeleteTb4b4b4, Te6edf3contentDescription Tff7b72= Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3clearTb4b4b4)Tb4b4b4)
Te6edf3SpacerTb4b4b4(Te6edf3ModifierTb4b4b4.Te6edf3widthTb4b4b4(T79c0ff8.Te6edf3dpTb4b4b4)Tb4b4b4)
Te6edf3TextTb4b4b4(Te6edf3text Tff7b72= Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3clearTb4b4b4)Tb4b4b4, Te6edf3maxLines Tff7b72= T79c0ff1Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Te6edf3OutlinedButtonTb4b4b4(Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3weightTb4b4b4(T79c0ff1fTb4b4b4)Tb4b4b4, Te6edf3onClick Tff7b72= Te6edf3onRequestTb4b4b4) Tb4b4b4{
Te6edf3IconTb4b4b4(Te6edf3imageVector Tff7b72= Te6edf3MeshtasticIconsTb4b4b4.Te6edf3RefreshTb4b4b4, Te6edf3contentDescription Tff7b72= Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3requestTb4b4b4)Tb4b4b4)
Te6edf3SpacerTb4b4b4(Te6edf3ModifierTb4b4b4.Te6edf3widthTb4b4b4(T79c0ff8.Te6edf3dpTb4b4b4)Tb4b4b4)
Te6edf3TextTb4b4b4(Te6edf3text Tff7b72= Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3requestTb4b4b4)Tb4b4b4, Te6edf3maxLines Tff7b72= T79c0ff1Tb4b4b4)
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3hasVisibleLocalStatsTb4b4b4) Tb4b4b4{
Te6edf3OutlinedButtonTb4b4b4(Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3fillMaxWidthTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3onClick Tff7b72= Te6edf3onSaveTb4b4b4) Tb4b4b4{
Te6edf3IconTb4b4b4(Te6edf3imageVector Tff7b72= Te6edf3MeshtasticIconsTb4b4b4.Te6edf3SaveTb4b4b4, Te6edf3contentDescription Tff7b72= Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3saveTb4b4b4)Tb4b4b4)
Te6edf3SpacerTb4b4b4(Te6edf3ModifierTb4b4b4.Te6edf3widthTb4b4b4(T79c0ff8.Te6edf3dpTb4b4b4)Tb4b4b4)
Te6edf3TextTb4b4b4(Te6edf3text Tff7b72= Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3saveTb4b4b4)Tb4b4b4, Te6edf3maxLines Tff7b72= T79c0ff1Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}

Tf0883e@SuppressTb4b4b4(Ta5d6ff"Ta5d6ffLongMethodTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffCyclomaticComplexMethodTa5d6ff"Tb4b4b4)
Tf0883e@Composable
Tff7b72private Tff7b72fun Td2a8ffSignalMetricsChartTb4b4b4(
Te6edf3modifierTb4b4b4: Te6edf3Modifier Tff7b72= Te6edf3ModifierTb4b4b4,
Te6edf3localStatsTb4b4b4: Te6edf3ListTff7b72<Te6edf3TelemetryTff7b72>Tb4b4b4,
Te6edf3meshPacketsTb4b4b4: Te6edf3ListTff7b72<Te6edf3MeshPacketTff7b72>Tb4b4b4,
Te6edf3vicoScrollStateTb4b4b4: Te6edf3VicoScrollStateTb4b4b4,
Te6edf3selectedXTb4b4b4: Tffa657Double?Tb4b4b4,
Te6edf3onPointSelectedTb4b4b4: Tb4b4b4(Tffa657DoubleTb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4,
Tb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3noiseFloorData Tff7b72= Te6edf3rememberTb4b4b4(Te6edf3localStatsTb4b4b4) Tb4b4b4{ Te6edf3localStatsTb4b4b4.Te6edf3filter Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3local_statsTff7b72?.Te6edf3noise_floor Tff7b72!Tff7b72= T79c0ff0 Tb4b4b4} Tb4b4b4}
Tff7b72val Te6edf3busyFloorData Tff7b72=
Te6edf3rememberTb4b4b4(Te6edf3noiseFloorDataTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3noiseFloorDataTb4b4b4.Te6edf3size Tff7b72> T79c0ff1Tb4b4b4) Te6edf3listOfTb4b4b4(Te6edf3noiseFloorDataTb4b4b4.Te6edf3firstTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3noiseFloorDataTb4b4b4.Te6edf3lastTb4b4b4(Tb4b4b4)Tb4b4b4) Tff7b72else Te6edf3emptyListTb4b4b4(Tb4b4b4)
Tb4b4b4}
Tff7b72val Te6edf3rssiData Tff7b72= Te6edf3rememberTb4b4b4(Te6edf3meshPacketsTb4b4b4) Tb4b4b4{ Te6edf3meshPacketsTb4b4b4.Te6edf3filter Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3rx_rssi Tff7b72!Tff7b72= Tff7b72null Tb4b4b4} Tb4b4b4}
Tff7b72val Te6edf3snrData Tff7b72= Te6edf3rememberTb4b4b4(Te6edf3meshPacketsTb4b4b4) Tb4b4b4{ Te6edf3meshPacketsTb4b4b4.Te6edf3filter Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3snrOrNullTb4b4b4(Tb4b4b4) Tff7b72!Tff7b72= Tff7b72null Tb4b4b4} Tb4b4b4}
Tff7b72val Te6edf3legendData Tff7b72=
Te6edf3rememberTb4b4b4(Te6edf3noiseFloorDataTb4b4b4, Te6edf3rssiDataTb4b4b4, Te6edf3snrDataTb4b4b4) Tb4b4b4{
Te6edf3LEGEND_DATATb4b4b4.Te6edf3filter Tb4b4b4{ Te6edf3legend Tff7b72-Tff7b72>
Tff7b72when Tb4b4b4(Te6edf3legendTb4b4b4.Te6edf3nameResTb4b4b4) Tb4b4b4{
Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3noise_floor Tff7b72-Tff7b72> Te6edf3noiseFloorDataTb4b4b4.Te6edf3isNotEmptyTb4b4b4(Tb4b4b4)
Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3rssi Tff7b72-Tff7b72> Te6edf3rssiDataTb4b4b4.Te6edf3isNotEmptyTb4b4b4(Tb4b4b4)
Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3snr Tff7b72-Tff7b72> Te6edf3snrDataTb4b4b4.Te6edf3isNotEmptyTb4b4b4(Tb4b4b4)
Tff7b72else Tff7b72-Tff7b72> Tff7b72true
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}

Te6edf3MetricChartScaffoldTb4b4b4(
Te6edf3isEmpty Tff7b72= Te6edf3meshPacketsTb4b4b4.Te6edf3isEmptyTb4b4b4(Tb4b4b4) Tff7b72&Tff7b72& Te6edf3localStatsTb4b4b4.Te6edf3isEmptyTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3legendData Tff7b72= Te6edf3legendDataTb4b4b4,
Te6edf3modifier Tff7b72= Te6edf3modifierTb4b4b4,
Tb4b4b4) Tb4b4b4{ Te6edf3modelProducerTb4b4b4, Te6edf3chartModifier Tff7b72-Tff7b72>
Tff7b72val Te6edf3noiseFloorColor Tff7b72= Te6edf3SignalMetricTb4b4b4.Te6edf3NOISE_FLOORTb4b4b4.Te6edf3color
Tff7b72val Te6edf3busyFloorColor Tff7b72= Te6edf3SignalMetricTb4b4b4.Te6edf3BUSY_FLOORTb4b4b4.Te6edf3color
Tff7b72val Te6edf3rssiColor Tff7b72= Te6edf3SignalMetricTb4b4b4.Te6edf3RSSITb4b4b4.Te6edf3color
Tff7b72val Te6edf3snrColor Tff7b72= Te6edf3SignalMetricTb4b4b4.Te6edf3SNRTb4b4b4.Te6edf3color
Tff7b72val Te6edf3noiseFloorLabel Tff7b72= Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3noise_floorTb4b4b4)
Tff7b72val Te6edf3busyFloorLabel Tff7b72= Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3busy_noise_floorTb4b4b4)
Tff7b72val Te6edf3rssiLabel Tff7b72= Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3rssiTb4b4b4)
Tff7b72val Te6edf3snrLabel Tff7b72= Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3snrTb4b4b4)

Te6edf3LaunchedEffectTb4b4b4(Te6edf3noiseFloorDataTb4b4b4, Te6edf3busyFloorDataTb4b4b4, Te6edf3rssiDataTb4b4b4, Te6edf3snrDataTb4b4b4) Tb4b4b4{
Te6edf3modelProducerTb4b4b4.Te6edf3runTransaction Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3noiseFloorDataTb4b4b4.Te6edf3isNotEmptyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3lineModel Tb4b4b4{
Te6edf3seriesTb4b4b4(
Te6edf3x Tff7b72= Te6edf3noiseFloorDataTb4b4b4.Te6edf3map Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3time Tb4b4b4}Tb4b4b4,
Te6edf3y Tff7b72= Te6edf3noiseFloorDataTb4b4b4.Te6edf3map Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3local_statsTff7b72?.Te6edf3noise_floor Tff7b72?: T79c0ff0 Tb4b4b4}Tb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3busyFloorDataTb4b4b4.Te6edf3isNotEmptyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3lineModel Tb4b4b4{ Te6edf3seriesTb4b4b4(Te6edf3x Tff7b72= Te6edf3busyFloorDataTb4b4b4.Te6edf3map Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3time Tb4b4b4}Tb4b4b4, Te6edf3y Tff7b72= Te6edf3busyFloorDataTb4b4b4.Te6edf3map Tb4b4b4{ Te6edf3BUSY_FLOOR_DBM Tb4b4b4}Tb4b4b4) Tb4b4b4}
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3rssiDataTb4b4b4.Te6edf3isNotEmptyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3lineModel Tb4b4b4{
Te6edf3seriesTb4b4b4(Te6edf3x Tff7b72= Te6edf3rssiDataTb4b4b4.Te6edf3map Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3rxTimeOrNullTb4b4b4(Tb4b4b4) Tff7b72?: T79c0ff0 Tb4b4b4}Tb4b4b4, Te6edf3y Tff7b72= Te6edf3rssiDataTb4b4b4.Te6edf3mapNotNull Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3rx_rssi Tb4b4b4}Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3snrDataTb4b4b4.Te6edf3isNotEmptyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
T8b949e/* Use a separate lineModel call to associate SNR with the right axis. */
Te6edf3lineModel Tb4b4b4{
Te6edf3seriesTb4b4b4(Te6edf3x Tff7b72= Te6edf3snrDataTb4b4b4.Te6edf3map Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3rxTimeOrNullTb4b4b4(Tb4b4b4) Tff7b72?: T79c0ff0 Tb4b4b4}Tb4b4b4, Te6edf3y Tff7b72= Te6edf3snrDataTb4b4b4.Te6edf3mapNotNull Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3snrOrNullTb4b4b4(Tb4b4b4) Tb4b4b4}Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}

Tff7b72val Te6edf3marker Tff7b72=
Te6edf3ChartStylingTb4b4b4.Te6edf3rememberMarkerTb4b4b4(
Te6edf3valueFormatter Tff7b72=
Te6edf3ChartStylingTb4b4b4.Te6edf3createColoredMarkerValueFormatter Tb4b4b4{ Te6edf3valueTb4b4b4, Te6edf3color Tff7b72-Tff7b72>
Tff7b72when Tb4b4b4(Te6edf3colorTb4b4b4.Te6edf3copyTb4b4b4(Te6edf3alpha Tff7b72= T79c0ff1fTb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3noiseFloorColor Tff7b72-Tff7b72> Ta5d6ff"Tffd700$Te6edf3noiseFloorLabelTa5d6ff: Tffd700${Te6edf3MetricFormatterTb4b4b4.Te6edf3rssiTb4b4b4(Te6edf3valueTb4b4b4.Te6edf3toIntTb4b4b4(Tb4b4b4)Tb4b4b4)Tffd700}Ta5d6ff"
Te6edf3busyFloorColor Tff7b72-Tff7b72> Ta5d6ff"Tffd700$Te6edf3busyFloorLabelTa5d6ff: Tffd700${Te6edf3MetricFormatterTb4b4b4.Te6edf3rssiTb4b4b4(Te6edf3valueTb4b4b4.Te6edf3toIntTb4b4b4(Tb4b4b4)Tb4b4b4)Tffd700}Ta5d6ff"
Te6edf3rssiColor Tff7b72-Tff7b72> Ta5d6ff"Tffd700$Te6edf3rssiLabelTa5d6ff: Tffd700${Te6edf3MetricFormatterTb4b4b4.Te6edf3rssiTb4b4b4(Te6edf3valueTb4b4b4.Te6edf3toIntTb4b4b4(Tb4b4b4)Tb4b4b4)Tffd700}Ta5d6ff"
Te6edf3snrColor Tff7b72-Tff7b72> Ta5d6ff"Tffd700$Te6edf3snrLabelTa5d6ff: Tffd700${Te6edf3MetricFormatterTb4b4b4.Te6edf3snrTb4b4b4(Te6edf3valueTb4b4b4.Te6edf3toFloatTb4b4b4(Tb4b4b4)Tb4b4b4)Tffd700}Ta5d6ff"
Tff7b72else Tff7b72-Tff7b72> Te6edf3valueTb4b4b4.Te6edf3toStringTb4b4b4(Tb4b4b4)
Tb4b4b4}
Tb4b4b4}Tb4b4b4,
Tb4b4b4)

Tff7b72val Te6edf3dbmRangeProvider Tff7b72= Te6edf3remember Tb4b4b4{ Te6edf3CartesianLayerRangeProviderTb4b4b4.Te6edf3fixedTb4b4b4(Te6edf3minY Tff7b72= Te6edf3MIN_DBM_AXISTb4b4b4, Te6edf3maxY Tff7b72= Te6edf3MAX_DBM_AXISTb4b4b4) Tb4b4b4}
Tff7b72val Te6edf3noiseFloorLayer Tff7b72=
Te6edf3rememberConditionalLayerTb4b4b4(
Te6edf3hasData Tff7b72= Te6edf3noiseFloorDataTb4b4b4.Te6edf3isNotEmptyTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3lineProvider Tff7b72= Te6edf3LineCartesianLayerTb4b4b4.Te6edf3LineProviderTb4b4b4.Te6edf3seriesTb4b4b4(Te6edf3ChartStylingTb4b4b4.Te6edf3createBoldLineTb4b4b4(Te6edf3noiseFloorColorTb4b4b4)Tb4b4b4)Tb4b4b4,
Te6edf3verticalAxisPosition Tff7b72= Te6edf3AxisTb4b4b4.Te6edf3PositionTb4b4b4.Te6edf3VerticalTb4b4b4.Te6edf3StartTb4b4b4,
Te6edf3rangeProvider Tff7b72= Te6edf3dbmRangeProviderTb4b4b4,
Tb4b4b4)
Tff7b72val Te6edf3busyFloorLayer Tff7b72=
Te6edf3rememberConditionalLayerTb4b4b4(
Te6edf3hasData Tff7b72= Te6edf3busyFloorDataTb4b4b4.Te6edf3isNotEmptyTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3lineProvider Tff7b72= Te6edf3LineCartesianLayerTb4b4b4.Te6edf3LineProviderTb4b4b4.Te6edf3seriesTb4b4b4(Te6edf3ChartStylingTb4b4b4.Te6edf3createDashedLineTb4b4b4(Te6edf3busyFloorColorTb4b4b4)Tb4b4b4)Tb4b4b4,
Te6edf3verticalAxisPosition Tff7b72= Te6edf3AxisTb4b4b4.Te6edf3PositionTb4b4b4.Te6edf3VerticalTb4b4b4.Te6edf3StartTb4b4b4,
Te6edf3rangeProvider Tff7b72= Te6edf3dbmRangeProviderTb4b4b4,
Tb4b4b4)
Tff7b72val Te6edf3rssiLayer Tff7b72=
Te6edf3rememberConditionalLayerTb4b4b4(
Te6edf3hasData Tff7b72= Te6edf3rssiDataTb4b4b4.Te6edf3isNotEmptyTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3lineProvider Tff7b72= Te6edf3LineCartesianLayerTb4b4b4.Te6edf3LineProviderTb4b4b4.Te6edf3seriesTb4b4b4(Te6edf3ChartStylingTb4b4b4.Te6edf3createDashedLineTb4b4b4(Te6edf3rssiColorTb4b4b4)Tb4b4b4)Tb4b4b4,
Te6edf3verticalAxisPosition Tff7b72= Te6edf3AxisTb4b4b4.Te6edf3PositionTb4b4b4.Te6edf3VerticalTb4b4b4.Te6edf3StartTb4b4b4,
Te6edf3rangeProvider Tff7b72= Te6edf3dbmRangeProviderTb4b4b4,
Tb4b4b4)
Tff7b72val Te6edf3snrLayer Tff7b72=
Te6edf3rememberConditionalLayerTb4b4b4(
Te6edf3hasData Tff7b72= Te6edf3snrDataTb4b4b4.Te6edf3isNotEmptyTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3lineProvider Tff7b72= Te6edf3LineCartesianLayerTb4b4b4.Te6edf3LineProviderTb4b4b4.Te6edf3seriesTb4b4b4(Te6edf3ChartStylingTb4b4b4.Te6edf3createDashedLineTb4b4b4(Te6edf3snrColorTb4b4b4)Tb4b4b4)Tb4b4b4,
Te6edf3verticalAxisPosition Tff7b72= Te6edf3AxisTb4b4b4.Te6edf3PositionTb4b4b4.Te6edf3VerticalTb4b4b4.Te6edf3EndTb4b4b4,
Tb4b4b4)

Tff7b72val Te6edf3layers Tff7b72=
Te6edf3rememberTb4b4b4(Te6edf3noiseFloorLayerTb4b4b4, Te6edf3busyFloorLayerTb4b4b4, Te6edf3rssiLayerTb4b4b4, Te6edf3snrLayerTb4b4b4) Tb4b4b4{
Te6edf3listOfNotNullTb4b4b4(Te6edf3noiseFloorLayerTb4b4b4, Te6edf3busyFloorLayerTb4b4b4, Te6edf3rssiLayerTb4b4b4, Te6edf3snrLayerTb4b4b4)
Tb4b4b4}

Tff7b72if Tb4b4b4(Te6edf3layersTb4b4b4.Te6edf3isNotEmptyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3GenericMetricChartTb4b4b4(
Te6edf3modelProducer Tff7b72= Te6edf3modelProducerTb4b4b4,
Te6edf3modifier Tff7b72= Te6edf3chartModifierTb4b4b4,
Te6edf3layers Tff7b72= Te6edf3layersTb4b4b4,
Te6edf3startAxis Tff7b72=
Tff7b72if Tb4b4b4(Te6edf3noiseFloorDataTb4b4b4.Te6edf3isNotEmptyTb4b4b4(Tb4b4b4) Tff7b72|Tff7b72| Te6edf3rssiDataTb4b4b4.Te6edf3isNotEmptyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3VerticalAxisTb4b4b4.Te6edf3rememberStartTb4b4b4(
Te6edf3label Tff7b72=
Te6edf3ChartStylingTb4b4b4.Te6edf3rememberAxisLabelTb4b4b4(
Te6edf3color Tff7b72= Tff7b72if Tb4b4b4(Te6edf3noiseFloorDataTb4b4b4.Te6edf3isNotEmptyTb4b4b4(Tb4b4b4)Tb4b4b4) Te6edf3noiseFloorColor Tff7b72else Te6edf3rssiColorTb4b4b4,
Tb4b4b4)Tb4b4b4,
Te6edf3valueFormatter Tff7b72= Tb4b4b4{ Te6edf3_Tb4b4b4, Te6edf3valueTb4b4b4, Te6edf3_ Tff7b72-Tff7b72> Te6edf3MetricFormatterTb4b4b4.Te6edf3rssiTb4b4b4(Te6edf3valueTb4b4b4.Te6edf3toIntTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4}Tb4b4b4,
Tb4b4b4)
Tb4b4b4} Tff7b72else Tb4b4b4{
Tff7b72null
Tb4b4b4}Tb4b4b4,
Te6edf3endAxis Tff7b72=
Tff7b72if Tb4b4b4(Te6edf3snrDataTb4b4b4.Te6edf3isNotEmptyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3VerticalAxisTb4b4b4.Te6edf3rememberEndTb4b4b4(
Te6edf3label Tff7b72= Te6edf3ChartStylingTb4b4b4.Te6edf3rememberAxisLabelTb4b4b4(Te6edf3color Tff7b72= Te6edf3snrColorTb4b4b4)Tb4b4b4,
Te6edf3valueFormatter Tff7b72= Tb4b4b4{ Te6edf3_Tb4b4b4, Te6edf3valueTb4b4b4, Te6edf3_ Tff7b72-Tff7b72> Te6edf3MetricFormatterTb4b4b4.Te6edf3snrTb4b4b4(Te6edf3valueTb4b4b4.Te6edf3toFloatTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4}Tb4b4b4,
Tb4b4b4)
Tb4b4b4} Tff7b72else Tb4b4b4{
Tff7b72null
Tb4b4b4}Tb4b4b4,
Te6edf3bottomAxis Tff7b72= Te6edf3CommonChartsTb4b4b4.Te6edf3rememberBottomTimeAxisTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3marker Tff7b72= Te6edf3markerTb4b4b4,
Te6edf3selectedX Tff7b72= Te6edf3selectedXTb4b4b4,
Te6edf3onPointSelected Tff7b72= Te6edf3onPointSelectedTb4b4b4,
Te6edf3vicoScrollState Tff7b72= Te6edf3vicoScrollStateTb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}

Tf0883e@Composable
Tff7b72private Tff7b72fun Td2a8ffnoiseFloorTextColorTb4b4b4(Te6edf3valueTb4b4b4: Tffa657IntTb4b4b4)Tb4b4b4: Te6edf3Color Tff7b72= Tff7b72when Tb4b4b4{
Te6edf3value Tff7b72=Tff7b72= T79c0ff0 Tff7b72-Tff7b72> Te6edf3MaterialThemeTb4b4b4.Te6edf3colorSchemeTb4b4b4.Te6edf3onSurfaceVariant
Te6edf3value Tff7b72< Te6edf3QUIET_NOISE_FLOOR_DBM Tff7b72-Tff7b72> Te6edf3SignalMetricTb4b4b4.Te6edf3SNRTb4b4b4.Te6edf3color
Te6edf3value Tff7b72< Te6edf3BUSY_FLOOR_DBM Tff7b72-Tff7b72> Te6edf3Orange
Tff7b72else Tff7b72-Tff7b72> Te6edf3MaterialThemeTb4b4b4.Te6edf3colorSchemeTb4b4b4.Te6edf3error
Tb4b4b4}

Tf0883e@SuppressTb4b4b4(Ta5d6ff"Ta5d6ffLongMethodTa5d6ff"Tb4b4b4)
Tf0883e@Composable
Tff7b72private Tff7b72fun Td2a8ffLocalStatsCardTb4b4b4(Te6edf3telemetryTb4b4b4: Te6edf3TelemetryTb4b4b4, Te6edf3isSelectedTb4b4b4: Tffa657BooleanTb4b4b4, Te6edf3onClickTb4b4b4: Tb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3localStats Tff7b72= Te6edf3telemetryTb4b4b4.Te6edf3local_stats
Tff7b72val Te6edf3time Tff7b72= Te6edf3telemetryTb4b4b4.Te6edf3timeTb4b4b4.Te6edf3toLongTb4b4b4(Tb4b4b4) Tff7b72* Te6edf3MS_PER_SEC
Tff7b72val Te6edf3noiseFloor Tff7b72= Te6edf3localStatsTff7b72?.Te6edf3noise_floor Tff7b72?: T79c0ff0

Te6edf3SelectableMetricCardTb4b4b4(Te6edf3isSelected Tff7b72= Te6edf3isSelectedTb4b4b4, Te6edf3onClick Tff7b72= Te6edf3onClickTb4b4b4) Tb4b4b4{
Te6edf3ColumnTb4b4b4(Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3fillMaxWidthTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3paddingTb4b4b4(T79c0ff1T79c0ff2.Te6edf3dpTb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3RowTb4b4b4(Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3fillMaxWidthTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3horizontalArrangement Tff7b72= Te6edf3ArrangementTb4b4b4.Te6edf3SpaceBetweenTb4b4b4) Tb4b4b4{
Te6edf3TextTb4b4b4(
Te6edf3text Tff7b72= Te6edf3DateFormatterTb4b4b4.Te6edf3formatDateTimeTb4b4b4(Te6edf3timeTb4b4b4)Tb4b4b4,
Te6edf3style Tff7b72= Te6edf3MaterialThemeTb4b4b4.Te6edf3typographyTb4b4b4.Te6edf3titleMediumEmphasizedTb4b4b4,
Te6edf3fontWeight Tff7b72= Te6edf3FontWeightTb4b4b4.Te6edf3BoldTb4b4b4,
Tb4b4b4)

Te6edf3TextTb4b4b4(
Te6edf3text Tff7b72=
Tff7b72if Tb4b4b4(Te6edf3noiseFloor Tff7b72!Tff7b72= T79c0ff0Tb4b4b4) Tb4b4b4{
Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3local_stats_noiseTb4b4b4, Te6edf3noiseFloorTb4b4b4)
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3noise_floor_no_readingTb4b4b4)
Tb4b4b4}Tb4b4b4,
Te6edf3style Tff7b72= Te6edf3MaterialThemeTb4b4b4.Te6edf3typographyTb4b4b4.Te6edf3labelLargeTb4b4b4,
Te6edf3fontWeight Tff7b72= Te6edf3FontWeightTb4b4b4.Te6edf3SemiBoldTb4b4b4,
Te6edf3color Tff7b72= Te6edf3noiseFloorTextColorTb4b4b4(Te6edf3noiseFloorTb4b4b4)Tb4b4b4,
Tb4b4b4)
Tb4b4b4}

Te6edf3SpacerTb4b4b4(Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3heightTb4b4b4(T79c0ff8.Te6edf3dpTb4b4b4)Tb4b4b4)

T8b949e// FlowRow(SpaceBetween): the relays stat wraps to its own line when the traffic label is too long,
T8b949e// instead of being crushed and wrapped one character per line.
Te6edf3FlowRowTb4b4b4(
Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3fillMaxWidthTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3horizontalArrangement Tff7b72= Te6edf3ArrangementTb4b4b4.Te6edf3SpaceBetweenTb4b4b4,
Te6edf3verticalArrangement Tff7b72= Te6edf3ArrangementTb4b4b4.Te6edf3spacedByTb4b4b4(T79c0ff4.Te6edf3dpTb4b4b4)Tb4b4b4,
Te6edf3itemVerticalAlignment Tff7b72= Te6edf3AlignmentTb4b4b4.Te6edf3CenterVerticallyTb4b4b4,
Tb4b4b4) Tb4b4b4{
Te6edf3TextTb4b4b4(
Te6edf3text Tff7b72=
Te6edf3stringResourceTb4b4b4(
Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3local_stats_trafficTb4b4b4,
Te6edf3localStatsTff7b72?.Te6edf3num_packets_tx Tff7b72?: T79c0ff0Tb4b4b4,
Te6edf3localStatsTff7b72?.Te6edf3num_packets_rx Tff7b72?: T79c0ff0Tb4b4b4,
Te6edf3localStatsTff7b72?.Te6edf3num_rx_dupe Tff7b72?: T79c0ff0Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Te6edf3style Tff7b72= Te6edf3MaterialThemeTb4b4b4.Te6edf3typographyTb4b4b4.Te6edf3labelLargeTb4b4b4,
Tb4b4b4)
Te6edf3TextTb4b4b4(
Te6edf3text Tff7b72=
Te6edf3stringResourceTb4b4b4(
Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3local_stats_relaysTb4b4b4,
Te6edf3localStatsTff7b72?.Te6edf3num_tx_relay Tff7b72?: T79c0ff0Tb4b4b4,
Te6edf3localStatsTff7b72?.Te6edf3num_tx_relay_canceled Tff7b72?: T79c0ff0Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Te6edf3style Tff7b72= Te6edf3MaterialThemeTb4b4b4.Te6edf3typographyTb4b4b4.Te6edf3labelLargeTb4b4b4,
Tb4b4b4)
Tb4b4b4}

Te6edf3SpacerTb4b4b4(Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3heightTb4b4b4(T79c0ff4.Te6edf3dpTb4b4b4)Tb4b4b4)

T8b949e// FlowRow(SpaceBetween): the uptime stat wraps to its own line when the nodes label is too long,
T8b949e// instead of being crushed and wrapped one character per line.
Te6edf3FlowRowTb4b4b4(
Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3fillMaxWidthTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3horizontalArrangement Tff7b72= Te6edf3ArrangementTb4b4b4.Te6edf3SpaceBetweenTb4b4b4,
Te6edf3verticalArrangement Tff7b72= Te6edf3ArrangementTb4b4b4.Te6edf3spacedByTb4b4b4(T79c0ff4.Te6edf3dpTb4b4b4)Tb4b4b4,
Te6edf3itemVerticalAlignment Tff7b72= Te6edf3AlignmentTb4b4b4.Te6edf3CenterVerticallyTb4b4b4,
Tb4b4b4) Tb4b4b4{
Te6edf3TextTb4b4b4(
Te6edf3text Tff7b72=
Te6edf3stringResourceTb4b4b4(
Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3local_stats_nodesTb4b4b4,
Te6edf3localStatsTff7b72?.Te6edf3num_online_nodes Tff7b72?: T79c0ff0Tb4b4b4,
Te6edf3localStatsTff7b72?.Te6edf3num_total_nodes Tff7b72?: T79c0ff0Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Te6edf3style Tff7b72= Te6edf3MaterialThemeTb4b4b4.Te6edf3typographyTb4b4b4.Te6edf3labelLargeTb4b4b4,
Tb4b4b4)
Te6edf3TextTb4b4b4(
Te6edf3text Tff7b72= Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3local_stats_uptimeTb4b4b4, Te6edf3formatUptimeTb4b4b4(Te6edf3localStatsTff7b72?.Te6edf3uptime_seconds Tff7b72?: T79c0ff0Tb4b4b4)Tb4b4b4)Tb4b4b4,
Te6edf3style Tff7b72= Te6edf3MaterialThemeTb4b4b4.Te6edf3typographyTb4b4b4.Te6edf3labelLargeTb4b4b4,
Tb4b4b4)
Tb4b4b4}

Tff7b72if Tb4b4b4(Tb4b4b4(Te6edf3localStatsTff7b72?.Te6edf3num_packets_rx_bad Tff7b72?: T79c0ff0Tb4b4b4) Tff7b72> T79c0ff0Tb4b4b4) Tb4b4b4{
Te6edf3SpacerTb4b4b4(Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3heightTb4b4b4(T79c0ff4.Te6edf3dpTb4b4b4)Tb4b4b4)
Te6edf3TextTb4b4b4(
Te6edf3text Tff7b72= Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3local_stats_badTb4b4b4, Te6edf3localStatsTff7b72?.Te6edf3num_packets_rx_bad Tff7b72?: T79c0ff0Tb4b4b4)Tb4b4b4,
Te6edf3style Tff7b72= Te6edf3MaterialThemeTb4b4b4.Te6edf3typographyTb4b4b4.Te6edf3labelLargeTb4b4b4,
Te6edf3color Tff7b72= Te6edf3MaterialThemeTb4b4b4.Te6edf3colorSchemeTb4b4b4.Te6edf3errorTb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}

Tf0883e@Composable
Tff7b72private Tff7b72fun Td2a8ffSignalMetricsCardTb4b4b4(Te6edf3meshPacketTb4b4b4: Te6edf3MeshPacketTb4b4b4, Te6edf3isSelectedTb4b4b4: Tffa657BooleanTb4b4b4, Te6edf3onClickTb4b4b4: Tb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3time Tff7b72= Tb4b4b4(Te6edf3meshPacketTb4b4b4.Te6edf3rxTimeOrNullTb4b4b4(Tb4b4b4) Tff7b72?: T79c0ff0Tb4b4b4)Tb4b4b4.Te6edf3toLongTb4b4b4(Tb4b4b4) Tff7b72* Te6edf3MS_PER_SEC
Te6edf3SelectableMetricCardTb4b4b4(Te6edf3isSelected Tff7b72= Te6edf3isSelectedTb4b4b4, Te6edf3onClick Tff7b72= Te6edf3onClickTb4b4b4) Tb4b4b4{
Te6edf3RowTb4b4b4(Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3fillMaxWidthTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3verticalAlignment Tff7b72= Te6edf3AlignmentTb4b4b4.Te6edf3CenterVerticallyTb4b4b4) Tb4b4b4{
T8b949e/* Data */
Te6edf3BoxTb4b4b4(Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3weightTb4b4b4(Te6edf3weight Tff7b72= T79c0ff5fTb4b4b4)Tb4b4b4.Te6edf3heightTb4b4b4(Te6edf3IntrinsicSizeTb4b4b4.Te6edf3MinTb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3ColumnTb4b4b4(Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3paddingTb4b4b4(T79c0ff1T79c0ff2.Te6edf3dpTb4b4b4)Tb4b4b4) Tb4b4b4{
T8b949e/* Time */
Te6edf3RowTb4b4b4(Te6edf3horizontalArrangement Tff7b72= Te6edf3ArrangementTb4b4b4.Te6edf3SpaceBetweenTb4b4b4) Tb4b4b4{
Te6edf3TextTb4b4b4(
Te6edf3text Tff7b72= Te6edf3DateFormatterTb4b4b4.Te6edf3formatDateTimeTb4b4b4(Te6edf3timeTb4b4b4)Tb4b4b4,
Te6edf3style Tff7b72= Te6edf3MaterialThemeTb4b4b4.Te6edf3typographyTb4b4b4.Te6edf3titleMediumEmphasizedTb4b4b4,
Te6edf3fontWeight Tff7b72= Te6edf3FontWeightTb4b4b4.Te6edf3BoldTb4b4b4,
Tb4b4b4)
Tb4b4b4}

Te6edf3SpacerTb4b4b4(Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3heightTb4b4b4(T79c0ff8.Te6edf3dpTb4b4b4)Tb4b4b4)

T8b949e/* SNR and RSSI */
Te6edf3RowTb4b4b4(Te6edf3verticalAlignment Tff7b72= Te6edf3AlignmentTb4b4b4.Te6edf3CenterVerticallyTb4b4b4) Tb4b4b4{
Te6edf3MetricValueRowTb4b4b4(Te6edf3color Tff7b72= Te6edf3SignalMetricTb4b4b4.Te6edf3RSSITb4b4b4.Te6edf3colorTb4b4b4, Te6edf3text Tff7b72= Te6edf3MetricFormatterTb4b4b4.Te6edf3rssiTb4b4b4(Te6edf3meshPacketTb4b4b4.Te6edf3rx_rssiTb4b4b4)Tb4b4b4)
Te6edf3SpacerTb4b4b4(Te6edf3ModifierTb4b4b4.Te6edf3widthTb4b4b4(T79c0ff1T79c0ff2.Te6edf3dpTb4b4b4)Tb4b4b4)
Te6edf3MetricValueRowTb4b4b4(
Te6edf3color Tff7b72= Te6edf3SignalMetricTb4b4b4.Te6edf3SNRTb4b4b4.Te6edf3colorTb4b4b4,
Te6edf3text Tff7b72= Te6edf3MetricFormatterTb4b4b4.Te6edf3snrTb4b4b4(Te6edf3meshPacketTb4b4b4.Te6edf3snrOrNullTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}

T8b949e/* Signal Indicator */
Te6edf3BoxTb4b4b4(Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3weightTb4b4b4(Te6edf3weight Tff7b72= T79c0ff3fTb4b4b4)Tb4b4b4.Te6edf3heightTb4b4b4(Te6edf3IntrinsicSizeTb4b4b4.Te6edf3MaxTb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3LoraSignalIndicatorTb4b4b4(Te6edf3snr Tff7b72= Te6edf3meshPacketTb4b4b4.Te6edf3snrOrNullTb4b4b4(Tb4b4b4)Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}

Served by rngit 1.5.0 - Generated in 0.15s